package com.bingbaihanji.core.config.mybatisplus;

import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.type.EnumTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 冰白寒祭
 * @date 2024-06-23 22:07:09
 * @description MyBatisPlus环境下使用MyBatis的配置类ConfigurationCustomizer
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            // 开启驼峰命名转换
            configuration.setMapUnderscoreToCamelCase(true);
            // 启用延迟加载
            configuration.setLazyLoadingEnabled(true);
            // 设置默认的脚本语言驱动为MybatisXMLLanguageDriver,这通常用于处理XML配置
            configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
            // 输出sql日志
            configuration.setLogImpl(Slf4jImpl.class);
            // 添加一个自定义的SQL拦截器插件,用于在SQL执行之前或之后进行一些自定义处理
            // 加载自定义sql日志
            configuration.addInterceptor(new SqlInterceptor());
            // 启用二级缓存,MyBatis的二级缓存是基于namespace级别的缓存
            configuration.setCacheEnabled(true);
            // 当从数据库查询的数据中包含null值时,
            // 调用对应的setter方法将null值赋给Java对象的属性
            configuration.setCallSettersOnNulls(true);
            // 设置当参数为null时,JDBC类型为NULL,这在某些数据库操作中很重要
            configuration.setJdbcTypeForNull(JdbcType.NULL);
            // 设置默认的执行器类型,SIMPLE执行器类型执行SQL时不进行预处理缓存,
            // REUSE执行器类型会重用预处理语句,BATCH执行器类型会批量执行SQL
            configuration.setDefaultExecutorType(ExecutorType.SIMPLE);
            // 设置是否开启自动驼峰命名规则映射,当开启时,数据库列名user_name可以映射到Java属性userName
            configuration.setMapUnderscoreToCamelCase(true);
            // 设置超时时间,单位为秒。如果SQL执行超过这个时间,会抛出超时异常
            configuration.setDefaultStatementTimeout(30);
            // 设置MyBatis在处理包含多结果集的查询时,将结果集映射到不同的对象集合中
            configuration.setMultipleResultSetsEnabled(true);
            // 设置是否使用列标签代替列名,默认为true,推荐开启
            configuration.setUseColumnLabel(true);
            // 设置是否允许在嵌套语句中使用分页查询,开启时MyBatis会在嵌套查询中使用分页查询
            configuration.setSafeResultHandlerEnabled(true);
            // 设置是否开启缓存,以便缓存查询结果,默认开启
            configuration.setCacheEnabled(true);
            // 设置默认的枚举处理器
            configuration.setDefaultEnumTypeHandler(EnumTypeHandler.class);
        };
    }
}


